home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1994 / 7 / 02 / tips&tricks / freset.s < prev    next >
Encoding:
Text File  |  1995-06-01  |  4.0 KB  |  165 lines

  1.     *************************************************
  2.     * Programmname:    FReset (von A.Schranz)        *
  3.     *                        *
  4.     * Funktion:    schneller Reset bei A1200    *
  5.     *                        *
  6.     * Sprache:    Assembler (DEVPAC 2.14D)    *
  7.     *************************************************
  8.  
  9.         INCDIR    INCLUDE/
  10.         INCLUDE    EXEC/EXECBASE.I
  11.         INCLUDE    EXEC/EXEC_LIB.I
  12.         INCLUDE    EXEC/RESIDENT.I
  13.         INCLUDE    HARDWARE/CUSTOM.I
  14.         INCLUDE    LIBRARIES/DOSEXTENS.I
  15.  
  16.     IFND    DMA
  17. DMA        EQU    $DFF000
  18.     ENDC
  19.  
  20.         Section    S,CODE
  21. S        MOVE.L    $4.W,A6
  22.         MOVE.L    ThisTask(A6),A3
  23.         MOVEQ    #0,D0
  24.         TST.L    pr_CLI(A3)
  25.         BNE.S    .CLI
  26.         LEA    pr_MsgPort(A3),A0
  27.         JSR    _LVOWaitPort(A6)
  28.         LEA    pr_MsgPort(A3),A0
  29.         JSR    _LVOGetMsg(A6)
  30. .CLI        MOVE.L    D0,-(SP)
  31.         LEA    S-4(PC),A2        ;Ist es der erste Programm-
  32.         MOVE.L    (A2),D0            ;aufruf, so wird das
  33.         ADDQ.L    #1,D0            ;zweite Segment von ersten
  34.         ADD.L    D0,D0            ;getrennt.
  35.         ADD.L    D0,D0            ;deshalb sollte A2 vor denn
  36.         MOVE.L    D0,-(SP)        ;Programmpunkt .1ST in (INIT)
  37.         RTS                ;nicht geändert werden.
  38.  
  39. ;--------------------------------------------->    INIT.routine
  40.         Section    InitRes,CODE_C
  41. INIT        LEA    RES_NAME(PC),A1        ;testen ob wir schon
  42.         JSR    _LVOFindResident(A6)    ;resident sind
  43.         TST.L    D0
  44.         BEQ.S    .G0
  45. .WB_CHECK    MOVE.L    (SP)+,D0
  46.         BEQ.S    .NO_WB
  47.         MOVE.L    D0,A1
  48.         JSR    _LVOReplyMsg(A6)
  49.         MOVEQ    #0,D0            ;ja
  50. .NO_WB        RTS
  51. .G0        MOVE.L    KickTagPtr(A6),D0    ;falls noch kein Reset
  52.         BEQ.S    .1ST            ;durchgeführt wurde,
  53. .NEXT_LIST    MOVE.L    D0,A0            ;testen ob wir in einer der
  54. .L0        MOVE.L    (A0)+,D0        ;KickTagPointers stehen
  55.         BEQ.S    .1ST            ;wenn 0 dann letzter eintrag
  56.         BPL.S    .SEARCH            ;falls negativ, handelt
  57.         BCLR    #31,D0            ;es sich um einen Zeiger
  58.         BRA.S    .NEXT_LIST        ;auf die nächste Liste
  59. .SEARCH        LEA    RES_NAME(PC),A1        ;ist es unsere ResidentStruktur?
  60.         MOVE.L    D0,A3
  61.         MOVE.L    RT_NAME(A3),A3
  62. .L1        CMPM.B    (A1)+,(A3)+
  63.         BNE.S    .L0
  64.         TST.B    -1(A3)
  65.         BNE.S    .L1
  66.         BRA.S    .WB_CHECK        ;ja !
  67. .1ST        MOVE.L    D0,(A2)            ;Sind noch nicht im System
  68.         LEA    KICKTAG_TABLE(PC),A0    ;(aber jetzt !!!)
  69.         LEA    RES_MEM_LIST(PC),A1
  70.         MOVE.L    KickTagPtr(A6),4(A0)    ;falls schon eine Liste
  71.         BEQ.S    .NO_KICKTAG        ;vorhanden dann mit vorzeichen
  72.         OR.B    #$80,4(A0)        ;in unser eintragen.
  73. .NO_KICKTAG    MOVE.L    A0,KickTagPtr(A6)
  74.         MOVE.L    KickMemPtr(A6),D0    ;da wir unser Programm nicht
  75.         BEQ.S    .1ST_KICKMEM        ;bei jedem Reset allokieren
  76.         MOVE.L    D0,LN_SUCC(A1)        ;wollen, tragen wir die
  77.         MOVE.L    D0,A0            ;MemoryNode in den KickMemPtr
  78.         MOVE.L    A1,LN_PRED(A0)        ;ein.
  79. .1ST_KICKMEM    MOVE.L    A1,KickMemPtr(A6)    ;zum schluß noch die
  80.         JSR    _LVOSumKickData(A6)    ;KickData Checksumme berechnen
  81.         MOVE.L    D0,KickCheckSum(A6)    ;und eintragen
  82.         BRA.S    .WB_CHECK
  83.  
  84. ;--------------------------------------------->    RESIDENT.routine
  85. REM_SCSI    MOVEM.L    D1-2/A0-2/A6,-(SP)
  86.         LEA    SCSI_N(PC),A1
  87.         MOVE.L    $4.W,A6
  88.         JSR    _LVOFindResident(A6)
  89.         TST.L    D0
  90.         BEQ.S    .ERROR
  91.         MOVE.L    ResModules(A6),A0
  92. .L0        MOVE.L    (A0)+,D1
  93.         BEQ.S    .ERROR
  94.         BPL.S    .G0
  95.         BCLR    #31,D1
  96.         MOVE.L    D1,A0
  97.         BRA.S    .L0
  98. .G0        CMP.L    D0,D1
  99.         BNE.S    .L0
  100.         MOVE.L    D0,A2
  101.         LEA    NEW_SCSI(PC),A1
  102.         MOVE.B    RT_PRI(A2),RT_PRI(A1)
  103.         MOVE.L    A2,RT_SIZE(A1)
  104.         MOVE.L    A1,-4(A0)
  105.         MOVEM.L    (SP)+,D1-2/A0-2/A6
  106.         MOVEQ    #0,D0
  107.         RTS
  108. .ERROR        MOVEQ    #-1,D0
  109.         MOVEQ    #9,D2
  110.         LEA    DMA,A5
  111. .L1        MOVE.W    vhposr(A5),D1
  112.         AND.W    #$F33,D1
  113.         MOVE.W    D1,$180(A5)
  114.         DBF    D0,.L1
  115.         DBF    D2,.L1
  116.         MOVEM.L    (SP)+,D1-2/A0-2/A6
  117.         RTS
  118.  
  119. REPARE        LEA    NEW_SCSI(PC),A0
  120.         MOVE.L    $4.W,A6
  121.         MOVE.L    ResModules(A6),A1
  122. .L0        MOVE.L    (A1)+,D0
  123.         BEQ.S    .FIN
  124.         BPL.S    .CHECK
  125.         BCLR    #31,D0
  126.         MOVE.L    D0,A1
  127.         BRA.S    .L0
  128. .CHECK        CMP.L    D0,A0
  129.         BNE.S    .L0
  130.         MOVE.L    RT_SIZE(A0),-4(A1)
  131. .FIN        RTS
  132. ;--------------------------------------------->    DATAFIELD's
  133.         CNOP    0,4
  134. NEW_SCSI    DC.W    RTC_MATCHWORD
  135.         DC.L    NEW_SCSI,RES_END
  136.         DC.B    1,1,0,0
  137.         DC.L    SCSI_N
  138.         DC.L    SCSI_N
  139.         DC.L    REPARE
  140.         DS.L    1            ;hier wird die Original
  141.         CNOP    0,4            ;ResidentStruktur gerettet
  142. RES_STRUCT    DC.W    RTC_MATCHWORD
  143.         DC.L    RES_STRUCT,RES_END    ;ab ResEnd weiter suchen !
  144.         DC.B    1            ;RT_FLAGS
  145.         DC.B    1            ;RT_VERSION
  146.         DC.B    0            ;RT_TYPE
  147.         DC.B    104            ;RT_PRI
  148.         DC.L    RES_NAME        ;RT_NAME
  149.         DC.L    RES_NAME        ;RT_IDSTRING
  150.         DC.L    REM_SCSI        ;RT_INIT
  151.         CNOP    0,4
  152. KICKTAG_TABLE    DC.L    RES_STRUCT
  153.         DS.L    1
  154. RES_MEM_LIST    DS.L    2
  155.         DC.B    NT_MEMORY,0
  156.         DC.L    RES_NAME
  157.         DC.W    1
  158.         DC.L    REM_SCSI,RES_END-REM_SCSI
  159. RES_NAME    DC.B    'FReset',0
  160. SCSI_N        DC.B    'scsi.device',0
  161.         EVEN
  162. RES_END
  163.  
  164.  
  165.